package br.uniriotec.pm.business.rules.impl;

import java.math.BigDecimal;

import br.uniriotec.pm.business.rules.RuleComissaoVendedor;
import br.uniriotec.pm.business.rules.exception.RuleException;
import br.uniriotec.pm.domain.Vendedor;
import br.uniriotec.pm.dto.CalculoComissaoVendedor;

public class RuleComissaoVendedorImpl implements RuleComissaoVendedor {
	
	private static final BigDecimal VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_1 = BigDecimal.valueOf(1000);
	private static final BigDecimal VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_2 = BigDecimal.valueOf(1800);
	
	private static final BigDecimal VENDEDOR_CATEGORIA_1_PERCENTUAL_FAIXA_COMISSAO_1 = BigDecimal.valueOf(0.1);
	private static final BigDecimal VENDEDOR_CATEGORIA_1_PERCENTUAL_FAIXA_COMISSAO_2 = BigDecimal.valueOf(0.15);
	private static final BigDecimal VENDEDOR_CATEGORIA_1_PERCENTUAL_FAIXA_COMISSAO_3 = BigDecimal.valueOf(0.2);
	
	private static final BigDecimal VENDEDOR_CATEGORIA_2_VALOR_LIMITE_FAIXA_COMISSAO_1 = BigDecimal.valueOf(2000);
	private static final BigDecimal VENDEDOR_CATEGORIA_2_VALOR_LIMITE_FAIXA_COMISSAO_2 = BigDecimal.valueOf(4000);
	
	private static final BigDecimal VENDEDOR_CATEGORIA_2_PERCENTUAL_FAIXA_COMISSAO_1 = BigDecimal.valueOf(0.1);
	private static final BigDecimal VENDEDOR_CATEGORIA_2_PERCENTUAL_FAIXA_COMISSAO_2 = BigDecimal.valueOf(0.2);
	private static final BigDecimal VENDEDOR_CATEGORIA_2_PERCENTUAL_FAIXA_COMISSAO_3 = BigDecimal.valueOf(0.3);
	
	public static final String ERRO_CATEGORIA_VENDEDOR_IDENTIFICADA = "N�o foi poss�vel identificar a categoria do vendedor.";

	@Override
	public BigDecimal avaliar(CalculoComissaoVendedor calculoComissaoVendedor) throws RuleException{		
		Vendedor vendedor = calculoComissaoVendedor.getVendedor();
		BigDecimal valorTotalVendas = calculoComissaoVendedor.getValorTotalVendas();
		
		BigDecimal valorComissao;
		
		if (vendedor.getCategoria().compareTo(Vendedor.CATEGORIA_1) == 0) {
			valorComissao = calcularComissaoVendedorCategoriaUm(valorTotalVendas);
		} else if (vendedor.getCategoria().compareTo(Vendedor.CATEGORIA_2) == 0) {
			valorComissao = calcularComissaoVendedorCategoriaDois(valorTotalVendas);
		} else {
			throw new RuleException(ERRO_CATEGORIA_VENDEDOR_IDENTIFICADA);
		}
		
		return retiraZerosDireita(valorComissao);
	}
	
	private BigDecimal calcularComissaoVendedorCategoriaUm(BigDecimal valorTotalVendas) {
		BigDecimal valorComissaoFaixa1;
		
		if (valorTotalVendas.compareTo(VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_1) < 0) {
			valorComissaoFaixa1 = valorTotalVendas.multiply(VENDEDOR_CATEGORIA_1_PERCENTUAL_FAIXA_COMISSAO_1);
		} else {
			valorComissaoFaixa1  = VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_1.multiply(VENDEDOR_CATEGORIA_1_PERCENTUAL_FAIXA_COMISSAO_1);
		}
		
		BigDecimal valorComissaoFaixa2;
		
		if (valorTotalVendas.compareTo(VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_1) > 0 && valorTotalVendas.compareTo(VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_2) < 0) {
			valorComissaoFaixa2 = (valorTotalVendas.subtract(VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_1)).multiply(VENDEDOR_CATEGORIA_1_PERCENTUAL_FAIXA_COMISSAO_2);
		} else if (valorTotalVendas.compareTo(VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_2) >= 0) {
			valorComissaoFaixa2 = (VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_2.subtract(VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_1)).multiply(VENDEDOR_CATEGORIA_1_PERCENTUAL_FAIXA_COMISSAO_2);
		} else {
			valorComissaoFaixa2 = BigDecimal.valueOf(0);
		}
		
		BigDecimal valorComissaoFaixa3;
		
		if (valorTotalVendas.compareTo(VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_2) > 0) {
			valorComissaoFaixa3 = (valorTotalVendas.subtract(VENDEDOR_CATEGORIA_1_VALOR_LIMITE_FAIXA_COMISSAO_2)).multiply(VENDEDOR_CATEGORIA_1_PERCENTUAL_FAIXA_COMISSAO_3);
		} else {
			valorComissaoFaixa3 = BigDecimal.valueOf(0);
		}
		
		BigDecimal valorComissao = valorComissaoFaixa1.add(valorComissaoFaixa2).add(valorComissaoFaixa3);
		
		return valorComissao;
	}
	
	private BigDecimal calcularComissaoVendedorCategoriaDois(BigDecimal valorTotalVendas) {
		BigDecimal valorComissao;
		
		if (valorTotalVendas.compareTo(VENDEDOR_CATEGORIA_2_VALOR_LIMITE_FAIXA_COMISSAO_1) <= 0) {
			valorComissao = valorTotalVendas.multiply(VENDEDOR_CATEGORIA_2_PERCENTUAL_FAIXA_COMISSAO_1);
		} else if (valorTotalVendas.compareTo(VENDEDOR_CATEGORIA_2_VALOR_LIMITE_FAIXA_COMISSAO_2) <= 0) {
			valorComissao = valorTotalVendas.multiply(VENDEDOR_CATEGORIA_2_PERCENTUAL_FAIXA_COMISSAO_2);
		} else {
			valorComissao = valorTotalVendas.multiply(VENDEDOR_CATEGORIA_2_PERCENTUAL_FAIXA_COMISSAO_3);
		}
		
		return valorComissao;
	}
	
	/**
	 * Retira os zeros a direita da parte fracionária. O número 119.1000 ficará
	 * 119.1
	 * 
	 * @param numero
	 * @return
	 */
	public BigDecimal retiraZerosDireita(final BigDecimal bigDecimal) {

		if (bigDecimal != null) {

			String numero = bigDecimal.toPlainString();
			String novoNumero = numero;
			final Integer indiceDecimal = novoNumero.indexOf(".");

			if (indiceDecimal > 0) {

				for (int i = numero.length() - 1; i > indiceDecimal; i--) {

					if (numero.charAt(i) == '0') {
						novoNumero = numero.substring(0, i);

					} else {
						break;
					}
				}
			}

			return new BigDecimal(novoNumero);

		} else {
			return null;
		}
	}
}
